package com.xjh.basestudy.designmode.behaviorMode.behaviorMode11_Interpreter;

import java.util.Arrays;

/**
 * @Author XuJianHua
 * @Date 2022/10/6 23:27
 * @Description
 *
 *基于“滑鼠精灵”的脚本，我们在第17行初始化了表达式语义树，接下来只需要调用其解释方法interpret()，即可完成整个翻译工作。
 * 可以看到由第30行起的输出结果一切正常，脚本顺利被转换成了指令输出。需要注意的是，语义树的生成是由客户端完成的，其实我们完全可以再设计一个语法分析器（evaluator）
 * ，它非常类似于编译器（compiler），以实现对各种脚本语言的自动化解析，并完成语义树的自动化生成。终于，“滑鼠精灵”有了脚本解释的能力，并顺利驱动鼠标动作，自动帮我们完成打怪升级，玩家再也不必没日没夜地重复这些机械操作了。
 * 此外，如果后期需要更强大的功能，我们还可以定义新的表达式解释器，例如增加键盘指令的解释器，然后加入语义树便可轻松实现扩展。
 */
public class Client {

    public static void main(String[] args) {
        /*
         * BEGIN            // 脚本开始
         * MOVE 500,600;    // 鼠标指针移动到坐标(500, 600)
         *   BEGIN LOOP 5   // 开始循环5次
         *      LEFT_CLICK; // 循环体内单击左键
         *      DELAY 1;    // 每次延迟1秒
         *   END;           // 循环体结束
         * RIGHT_DOWN;      // 按下右键
         * DELAY 7200;      // 延迟2小时
         * END;             // 脚本结束
         */

        // 构造指令集语义树，实际情况会交给语法分析器（Evaluator or Parser）
        Expression sequence = new Sequence(Arrays.asList(
                new Move(500, 600),
                new Repetition(
                        new Sequence(
                                Arrays.asList(new LeftKeyClick(), new Delay(1))
                        ),
                        5 // 循环5次
                ),
                new LeftKeyDown(),
                new Delay(7200)
        ));

        sequence.interpret();
        /*输出
            移动鼠标：【500,600】
            按下鼠标：左键
            松开鼠标：左键
            系统延迟：1秒
            按下鼠标：左键
            松开鼠标：左键
            系统延迟：1秒
            按下鼠标：左键
            松开鼠标：左键
            系统延迟：1秒
            按下鼠标：左键
            松开鼠标：左键
            系统延迟：1秒
            按下鼠标：左键
            松开鼠标：左键
            系统延迟：1秒
            按下鼠标：右键
            系统延迟：7200秒
         */
    }

}